package com.example.es.entity;

import lombok.Data;
import org.springframework.data.elasticsearch.annotations.Document;
import org.springframework.data.elasticsearch.annotations.Field;
import org.springframework.data.elasticsearch.annotations.FieldType;
import java.util.List;

/**
 * 功能描述: 产品类
 * @author: wangjf
 * @createTime: 2020/3/26 17:26
 * @return
 */
@Data
@Document(indexName = "test", type = "product", replicas = 0)
//indexName索引名称 可以理解为数据库名 必须为小写 不然会报org.elasticsearch.indices.InvalidIndexNameException异常
//type类型 可以理解为表名
//replicas 数据备份数，如果只有一台机器，设置为0
public class Product {
    /*
     * @Name: 商品Id
     * @Example: 1
     * @Description:
     */
    private Long id;
    /*
     * @Name: 品牌名称
     * @Example: 小米
     * @Description:
     */
    @Field(type = FieldType.Keyword)
    private String brand;
    /*
     * @Name: 分类id (1-手机 | 2-笔记本)
     * @Example:
     * @Description:
     */
    @Field(type = FieldType.Long)
    private Long category;
    /*
     * @Name: 商品名称
     * @Example: 小米9pro 5G版手机 钛银黑 12G+512G
     * @Description:
     */
    @Field(type = FieldType.Text)
    private String name;
    /*
     * @Name: 商品规格
     * @Example: [
            {
                "attrName": "颜色",
                "attrValue": "钛银黑"
            },
            {
                "attrName": "内存",
                "attrValue": "512G"
            }
        ]
     * @Description: 这里一定要使用nested(嵌套类型)
     * 【与object区别在于可以很好的处理数组对象的内部关系，在内部，嵌套对象将数组中的每个对象索引为单独的隐藏文档，这意味着可以独立于其他对象查询每个嵌套对象】
     * 详见：https://blog.csdn.net/laoyang360/article/details/82950393
     */
    @Field(type = FieldType.Nested)
    private List<Attr> attrs;

    @Data
    public static class Attr{
        @Field(type = FieldType.Keyword)
        private String attrName;
        @Field(type = FieldType.Keyword)
        private String attrValue;
    }


    public interface FieldName {
        String ID = "id";
        String NAME = "name";
        String CATEGORY = "category";
        String BRAND = "brand";
        String ATTRS = "attrs";
        String ATTRS_NAME = "attrs.attrName";
        String ATTRS_VALUE = "attrs.attrValue";
    }

}
